package com.yunyun400.vosk.components;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.vosk.Model;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.yunyun400.vosk.util.Language;

@Component
public class VoskModelManager {
    private static final Logger logger = LoggerFactory.getLogger(VoskModelManager.class);
    
    private final Map<Language, Model> models = new HashMap<>();
    
    // 中文模型路径
    @Value("${vosk.model.cn.path:}")
    private String modelCnPath;
    
    // 泰语模型路径
    @Value("${vosk.model.th.path:}")
    private String modelThPath;
    
    // 英语模型路径
    @Value("${vosk.model.en.path:}")
    private String modelEnPath;
    
    @PostConstruct
    public void init() throws IOException {
        logger.info("开始加载所有 Vosk 语言模型...");

        try {
            // 简化版：直接加载各语言模型，不再使用复杂的路径解析
            loadModelIfPathExists(Language.CN, modelCnPath);
            loadModelIfPathExists(Language.TH, modelThPath);
            loadModelIfPathExists(Language.EN, modelEnPath);

            if (models.isEmpty()) {
                logger.warn("警告：没有成功加载任何语言模型，请检查配置文件中的模型路径");
            } else {
                logger.info("成功加载了 {} 个 Vosk 语言模型！", models.size());
            }
        } catch (Exception e) {
            logger.error("加载Vosk模型时发生错误", e);
            throw new RuntimeException("模型加载失败，请确保模型路径配置正确且模型文件存在", e);
        }
    }
    
    /**
     * 简化的模型加载方法：如果路径存在，则加载模型
     */
    private void loadModelIfPathExists(Language lang, String path) throws IOException {
        if (path != null && !path.isEmpty()) {
            File modelFile = new File(path);
            if (modelFile.exists() && modelFile.isDirectory()) {
                logger.info("正在加载 {} 模型，路径: {}", lang, path);
                Model model = new Model(path);
                models.put(lang, model);
                logger.info("{} 模型加载成功！", lang);
            } else {
                logger.warn("{} 模型路径不存在或不是目录: {}", lang, path);
            }
        } else {
            logger.warn("{} 模型路径未配置", lang);
        }
    }

    /**
     * 根据语言枚举获取对应的 Vosk 模型。
     * @param language 语言枚举
     * @return Vosk 模型对象，如果找不到则返回 null
     */
    public Model getModel(Language language) {
        return models.get(language);
    }
}